package com.apply.leetcode.puzzle203;

/**
 * 【不使用虚拟节点】
 * 来删除链表中指定值的节点
 * 1->2->6->3->4->5->6  删除 6 之后
 * 1->2->3->4->5
 */
public class Solution {

    /**
     *  删除链表需要遍历到要删除的那个节点之前的节点
     *  头结点之前没有节点因此需要特殊处理或者使用头节点
     * @param head
     * @param val
     * @return
     */
    public ListNode removeElements(ListNode head, int val) {

        // 如果链表一开始的值就是要删除的那就开始循环删除
        while (head != null && head.val == val) {
           /* ListNode delNode = head;
            head = head.next;
            delNode.next = null;*/
           // 写法2：(只是指针移动而已，没有将断开的节点设置为空)
            head = head.next;
        }
        if (head == null) {
            return null;
        }
        // 处理中间存在需要删除的节点(当前传入的head绝对不需要删除)
        ListNode prev = head;
        while (prev.next != null) {
            if (prev.next.val == val) {
                ListNode delNode = prev.next;
                // 指针向后移动
                prev.next = delNode.next;
                delNode.next = null;
            }else {
                prev = prev.next;
            }
        }
        return head;
    }

    public static void main(String[] args) {
        // 把数组转化为链表并打印
        int[] nums = {1,2,6,3,4,5,6};
        ListNode head = new ListNode(nums);
        System.out.println(head);

        // 删除全部指定值的节点
        Solution solution = new Solution();
        ListNode res = solution.removeElements(head, 6);
        System.out.println(res);
    }
}
